package com.bl.commons.utils;

import ch.qos.logback.core.net.SyslogConstants;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import com.bl.commons.constants.SysConstants;
import com.bl.commons.exceptions.ServiceException;
import com.google.common.base.Utf8;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * hutool包基础封装的一些方法
 *
 * @author bl
 * @date 2023/11/24
 */
public class HutoolUtils {


    /**
     * hutool的poi导出和EasyExcel区别:
     * POI由于在操作excel时是先将所有数据都读入内存后，再写入文件，比较消耗内存，特别是大数据量时，容易出现OOM
     * EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中，而是从磁盘上一行行读取数据，逐个解析。
     * 1.少量数据导出,poi比easyExcel稍快,数据量大到一定程度(跟上边的内存使用相关),easyExcel比poi导出更快了
     * 2.poi有最大导出数量限制:仅当前测试: poi可导出最大行数是[poi导出65536条数据总耗时===1846],easyExcel暂时10w的量级依然支持
     *
     * 动态表头数据导出
     * @param fileName 文件名称
     * @param datas 数据
     * @param headerAlias 表头
     * @param response 响应
     * @param excelType 文件类型
     */
    public static void dynamicExport(String fileName,List<Map<String,Object>> datas,
                                     Map<String,String> headerAlias,
                                     HttpServletResponse response,
                                     String excelType) throws IOException{
        // 通过工具类创建writer，默认创建xls格式
        ExcelWriter writer = ExcelUtil.getWriter();
        //设置响应
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + excelType);
        //设置表头
        for (Map.Entry<String, String> head : headerAlias.entrySet()) {
            writer.addHeaderAlias(head.getKey(), head.getValue());
        }
        writer.write(datas, true);
        writer.flush(response.getOutputStream(), true);
        writer.close();
    }

}
